home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / epp / pmodules / sysdate.e < prev    next >
Text File  |  1980-01-05  |  3KB  |  93 lines

  1. /* NOTE:  sd_init () is called automatically. */
  2.  
  3. OPT TURBO
  4.  
  5. /* Holds a julian date.  These are easiest to perform calculations with. */
  6. OBJECT sd_julianDateType
  7.   year, day
  8. ENDOBJECT
  9.  
  10. DEF sd_month_BeginDay=NIL,  /* Day of year that month starts on. */
  11.     sd_monthName[12]:ARRAY OF LONG  /* String values for months.       */
  12.  
  13. PROC sd_isLeapYear(year) RETURN (Mod(year, 4)=0)
  14.  
  15. PROC sd_init()
  16.   sd_month_BeginDay:=[  1,  32,  60,  91, 121, 152,
  17.                       182, 213, 244, 274, 305, 335]
  18.   sd_monthName[ 0]:='January'
  19.   sd_monthName[ 1]:='February'
  20.   sd_monthName[ 2]:='March'
  21.   sd_monthName[ 3]:='April'
  22.   sd_monthName[ 4]:='May'
  23.   sd_monthName[ 5]:='June'
  24.   sd_monthName[ 6]:='July'
  25.   sd_monthName[ 7]:='August'
  26.   sd_monthName[ 8]:='September'
  27.   sd_monthName[ 9]:='October'
  28.   sd_monthName[10]:='November'
  29.   sd_monthName[11]:='December'
  30. ENDPROC
  31.   /* sd_init */
  32.  
  33. PROC sd_monthFrom(julianDate:PTR TO sd_julianDateType)
  34.   DEF day, m
  35.   IF sd_month_BeginDay=NIL THEN sd_init()
  36.   day:=julianDate.day
  37.   IF day<Long(sd_month_BeginDay+4) THEN RETURN 1
  38.   IF sd_isLeapYear(julianDate.year) THEN DEC day
  39.   FOR m:=2 TO 11 DO IF day<Long(sd_month_BeginDay+(Mul(m, 4))) THEN RETURN m
  40. ENDPROC m
  41.   /* sd_monthFrom */
  42.  
  43. PROC sd_monthNameFor(monthNumber) RETURN sd_monthName[monthNumber-1]
  44.   /* Month number must be 1-12.  Can be gotten via sd_monthFrom(). */
  45.  
  46. PROC sd_dayOfMonthFrom(julianDate:PTR TO sd_julianDateType)
  47.   /* Variables used here for readability. */
  48.   DEF today, month, month_BeginDay, leapYearAdjustment=0
  49.   today:=julianDate.day
  50.   month:=sd_monthFrom(julianDate)
  51.   month_BeginDay:=Long(sd_month_BeginDay+Mul((month-1),4))
  52.   IF (sd_isLeapYear(julianDate.year)) AND (month>2) THEN DEC leapYearAdjustment
  53.   RETURN (today-month_BeginDay+1+leapYearAdjustment)
  54. ENDPROC
  55.   /* sd_dayOfMonthFrom */
  56.  
  57. PROC sd_add(julianDate:PTR TO sd_julianDateType, numberOfDays)
  58.   /* Add any number of days (within reason) to a julian date. Returns the */
  59.   /* computed julian date.  The parameter julianDate is unmodified.       */
  60.   DEF computedJulianDate:sd_julianDateType, newNumberOfDays
  61.   IF sd_month_BeginDay=NIL THEN sd_init()
  62.   IF ((sd_isLeapYear(julianDate.year)=FALSE) AND
  63.       (julianDate.day+numberOfDays<=365)) OR
  64.      ((sd_isLeapYear(julianDate.year)) AND
  65.       (julianDate.day+numberOfDays<=365))
  66.     computedJulianDate.year:=julianDate.year
  67.     computedJulianDate.day:=julianDate.day+numberOfDays
  68.   ELSE
  69.     computedJulianDate.year:=julianDate.year+1
  70.     computedJulianDate.day:=1;
  71.     IF sd_isLeapYear(julianDate.year)=FALSE
  72.       newNumberOfDays:=numberOfDays-(365-julianDate.day+1)
  73.     ELSE
  74.       newNumberOfDays:=numberOfDays-(366-julianDate.day+1)
  75.     ENDIF
  76.     RETURN sd_add(computedJulianDate, newNumberOfDays)
  77.   ENDIF
  78. ENDPROC computedJulianDate
  79.   /* sd_add */
  80.  
  81. PROC sd_getCurrentDate(julianDate:PTR TO sd_julianDateType)
  82. /* Parameter julianDate must not be NIL! */
  83.   DEF ds:datestamp, baseDate:sd_julianDateType, currentDate:PTR TO sd_julianDateType
  84.   DateStamp(ds)
  85.   baseDate.year:=1978  /* All dates are derived from this year. */
  86.   baseDate.day:=1      /* 1 January (julian format).            */
  87.   currentDate:=sd_add(baseDate, ds.days)
  88.   julianDate.year:=currentDate.year
  89.   julianDate.day:=currentDate.day
  90. ENDPROC julianDate
  91.   /* sd_getCurrentDate */
  92.  
  93.